import os
import re
import time

from core import chaojiying
from PIL import Image
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


def main():
    chrome_options = Options()
    # 移除不必要的日志输出
    chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

    # 禁用代理设置
    os.environ["HTTP_PROXY"] = ""
    os.environ["HTTPS_PROXY"] = ""

    service = Service("./core/chromedriver.exe")  # 替换成 chromedriver.exe 的实际路径
    browser = webdriver.Chrome(service=service, options=chrome_options)  # 打开浏览器

    # 自动最大化窗口，适配当前显示器
    browser.maximize_window()

    # 跳转至首页并用管理员用户登录
    print("\n正在跳转至 Disusz 社区论坛首页")
    browser.get("http://3.1.204.38")  ### 跳转至 Disusz 社区论坛首页（改为你自己的地址）

    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//em[contains(.,'登录')]"))
    ).click()  # 点击登录按钮
    time.sleep(2)

    # 获取 seccodehash
    seccodehash_value = get_seccodehash(browser)

    # 点击用户名输入框
    username_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.NAME, "username"))
    )
    username_field.click()

    ### 在用户名输入框中输入管理员用户名
    username_field.send_keys("admin")

    # 点击密码输入框
    password_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.NAME, "password"))
    )
    password_field.click()

    ### 在密码输入框中输入管理员密码
    password_field.send_keys("aws4!#@zxd")

    # 点击安全提问下拉菜单
    safe_question = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//td/select"))
    )
    safe_question.click()
    time.sleep(1)

    # 点击安全提问类型
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located(
            (By.XPATH, "//td/select/option[2]")
        )  ###设置你的提问类型，用数字来选择，这里的 2 在 Discuz 论坛中表示 "母亲的名字"
    ).click()

    time.sleep(1)

    # 点击答案输入框
    answer_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[4]/table/tbody/tr/td/input"))
    )
    answer_field.click()

    ### 输入正确答案
    answer_field.send_keys("muse")

    ## 获取验证码图片
    # 等待验证码图片的元素加载完成
    captcha_element = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located(
            (By.XPATH, f"//span[@id='vseccode_{seccodehash_value}']/img")
        )
    )
    # 保存验证码图片
    file_path = "./core/yanzhengma.png"
    save_captcha_image(browser, captcha_element, file_path)

    time.sleep(1)

    # 通过超级鹰识别验证码图片
    yanzhengma = chaojiying.get_yanzhengma(file_path)

    # 点击验证码框
    yanzhengma_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located(
            (By.XPATH, f"//*[@id='seccodeverify_{seccodehash_value}']")
        )
    )
    yanzhengma_field.click()

    # 在验证码框中输入验证码、
    yanzhengma_field.send_keys(yanzhengma)

    # 点击表单的登录
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//strong[contains(.,'登录')]"))
    ).click()  # 点击登录按钮

    time.sleep(4)

    ## 跳转到论坛后台登录页面
    print("\n正在跳转至 Disusz 社区论坛后台登录页面")
    browser.get("http://3.1.204.38/admin.php")  ### 跳转至 Disusz 社区论坛后台登录页面

    time.sleep(2)

    ## 进入后台登录界面（管理员用户需要再次输入：错误密码，无安全提问）
    # 点击后台登录界面密码框
    admin_password_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//*[@id='loginform']/input[4]"))
    )
    admin_password_field.click()

    ### 在后台登录界面密码框中输入密码
    admin_password_field.send_keys("aws4!#@zxd")

    # 点击安全提问
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//*[@id='loginform']/p"))
    ).click()

    # 选择提问类型
    WebDriverWait(browser, 10).until(
        EC.element_to_be_clickable((By.ID, "questionid"))
    ).click()
    WebDriverWait(browser, 10).until(
        EC.element_to_be_clickable(
            (By.XPATH, '//select[@id="questionid"]/option[2]')
        )  ###设置你的提问类型，用数字来选择，这里的 2 在 Discuz 论坛中表示 "母亲的名字"
    ).click()

    # 点击答案输入框
    admin_answer_field = WebDriverWait(browser, 10).until(
        EC.element_to_be_clickable((By.NAME, "admin_answer"))
    )
    admin_answer_field.click()

    ### 输入正确答案
    admin_answer_field.send_keys("muse")

    # 直接在后台登录界面点击提交按钮
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//*[@id='loginform']/button"))
    ).click()
    time.sleep(3)

    # 切换到 iframe
    iframe = browser.find_element(By.TAG_NAME, "iframe")
    browser.switch_to.frame(iframe)

    print("\n管理员界面中留言")

    # 点击留言输入框
    message_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[2]/input"))
    )
    # 使用 JavaScript 滚动到该元素
    browser.execute_script("arguments[0].scrollIntoView();", message_field)

    message_field.click()

    ### 输入留言
    message = "你好！😊 希望你今天一切顺利！如果有任何问题，请随时联系我。🚀记得关注我们的最新动态！🔔 不要错过任何更新哦！🌟#祝你好运！ #保持积极 🌈"

    # 使用 JavaScript 插入字符
    browser.execute_script("arguments[0].value = arguments[1];", message_field, message)

    # 点击有效期输入框
    validity_field = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[2]/input[2]"))
    )
    validity_field.click()

    # 清除输入框中的内容
    validity_field.clear()

    ### 输入正确有效期
    validity_field.send_keys("10")

    # 点击提交按钮
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[2]/input[3]"))
    ).click()

    # 切换回主页面
    browser.switch_to.default_content()

    # 退出浏览器
    input("\n输入任何按键退出。")
    browser.quit()


def get_seccodehash(browser):
    page_source = browser.page_source  # 获取页面源代码

    # 使用正则提取 <script> 标签中的 idhash 值
    match = re.search(r"idhash=([a-zA-Z0-9]+)", page_source)

    if match:
        idhash_value = match.group(1)  # 提取 idhash 值
        print(f"idhash: {idhash_value}")
        return idhash_value
    else:
        print("未能找到 idhash")
        return None


def save_captcha_image(browser, captcha_element, save_path):
    # 获取验证码图片的位置信息
    location = captcha_element.location  # 元素左上角坐标 (x, y)
    size = captcha_element.size  # 元素宽度和高度 (width, height)

    # 截取整个页面截图
    screenshot_path = "./core/full_page_screenshot.png"
    browser.save_screenshot(screenshot_path)

    # 打开截图并裁剪验证码区域
    image = Image.open(screenshot_path)

    # 获取页面缩放比例
    scale = browser.execute_script("return window.devicePixelRatio;")

    # 计算验证码区域的边界框，考虑缩放比例
    left = location["x"] * scale
    top = location["y"] * scale
    right = (location["x"] + size["width"]) * scale
    bottom = (location["y"] + size["height"]) * scale

    print("验证码区域：")
    print(f"左: {left}, 上: {top}, 右: {right}, 下: {bottom}")

    # 裁剪验证码区域
    captcha_image = image.crop((left, top, right, bottom))

    # 确保保存路径目录存在
    os.makedirs(os.path.dirname(save_path), exist_ok=True)

    # 保存裁剪后的验证码图片
    captcha_image.save(save_path)
    print(f"验证码图片已保存到: {save_path}")


if __name__ == "__main__":
    main()
